﻿
using System;
using System.Data.SqlClient;
using System.Globalization;
using System.Runtime.Serialization;
using ProtoBuf;/*https://github.com/ServiceStack/ServiceStack/tree/master/lib*/
using ServiceStack.Text;/*https://github.com/ServiceStack/ServiceStack.Text*/
using V82;
using V82.ОбщиеОбъекты;
using V82.СправочникиСсылка;
using V82.СправочникиОбъект;
using V82.ДокументыСсылка;
using V82.Перечисления;//Ссылка;
namespace V82.СправочникиОбъект
{
	[ProtoContract]
	[DataContract]
	public partial class ТиповыеАнкеты:СправочникОбъект
	{
		public bool _ЭтоНовый;
		public bool ЭтоНовый()
		{
			return _ЭтоНовый;
		}
		[DataMember]
		[ProtoMember(1)]
		public Guid Ссылка {get;set;}
		[DataMember]
		[ProtoMember(2)]
		public long Версия {get;set;}
		[DataMember]
		[ProtoMember(3)]
		public string ВерсияДанных {get;set;}
		/*static хэш сумма состава и порядка реквизитов*/
		/*версия класса восстановленного из пакета*/
		[DataMember]
		[ProtoMember(4)]
		public bool ПометкаУдаления {get;set;}
		[DataMember]
		[ProtoMember(5)]
		public bool Предопределенный {get;set;}
		[DataMember]
		[ProtoMember(6)]
		public V82.СправочникиСсылка.ТиповыеАнкеты Родитель {get;set;}
		[DataMember]
		[ProtoMember(7)]
		public bool ЭтоГруппа {get;set;}
		[DataMember]
		[ProtoMember(8)]
		public string/*9*/ Код {get;set;}
		[DataMember]
		[ProtoMember(9)]
		public string/*50*/ Наименование {get;set;}
		[DataMember]
		[ProtoMember(10)]
		public bool ЗагружатьОбъекты {get;set;}//Загружать объекты
		[DataMember]
		[ProtoMember(11)]
		public ХранилищеЗначения МакетАнкеты {get;set;}//Макет анкеты
		[DataMember]
		[ProtoMember(12)]
		public V82.Перечисления/*Ссылка*/.ВидыОбъектовЗагружаемыхИзОпроса ВидСправочникаДляЗагрузки {get;set;}//Вид справочника для загрузки
		///<summary>
		///Установка данного флажка говорит о том, что анкета будет предназначена конкретным людям
		///</summary>
		[DataMember]
		[ProtoMember(13)]
		public bool Адресная {get;set;}
		[DataMember]
		[ProtoMember(14)]
		public string/*(200)*/ НаименованиеАнкеты {get;set;}//Наименование анкеты
		[DataMember]
		[ProtoMember(15)]
		public string/*(0)*/ Вступление {get;set;}
		[DataMember]
		[ProtoMember(16)]
		public bool ЗаполнятьАнкетуДанными {get;set;}//Заполнять анкету данными
		[DataMember]
		[ProtoMember(17)]
		public V82.Перечисления/*Ссылка*/.ВидыАнкет ВидАнкеты {get;set;}//Вид анкеты
		[DataMember]
		[ProtoMember(18)]
		public decimal/*(5)*/ СекундОтвета {get;set;}//Секунд ответа
		public void Записать()
		{
			//Установка блокировки элемента на горизантально масштабированный кластер.
			//Опционально введение тайм аута на запись одного и того же объекта, не чаще раза в 5-секунд. Защита от спама. упращение алгоритма блокировки.
			//Выделение сервиса для блокировки элемента и генерации кода
			//Выполнение операций контроля без обращений к sql-серверу.
			//Контроль конфликта блокировок.
			//Контроль загрузки булкинсертом гетерогенной коллекции.
			//Контроль уникальности кода для справочников.
			//Контроль уникальности номера для документов, в границах префикса.
			//Контроль владельца, он не может быть группой.
			//Контроль владельца он должен быть задан.
			//Контроль родителя он должен быть группой.
			//Контроль количества уровней, должен соотвествовать метаданным.
			//Контроль версии, объект не должен был быть записан перед чтением текущей записи, алгоритм версионника.
			//Контроль уникальности ссылки
			//Контроль зацикливания
			//Опционально контроль битых ссылок.
			//Соблюдейние транзакционности. ПередЗаписью. Открытие транзации. Валидации. ПриЗаписи. Фиксация транзакции. Информирование о записи элемента.
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					if(_ЭтоНовый)
					{
						Команда.CommandText = @"
						Insert Into _Reference178(
						_IDRRef
						/*,_Version*/
						,_Marked
						,_IsMetadata
						,_ParentIDRRef
						,_Folder
						,_Code
						,_Description
						,_Fld2066
						,_Fld2067
						,_Fld2068RRef
						,_Fld2069
						,_Fld2070
						,_Fld2071
						,_Fld21289
						,_Fld21290RRef
						,_Fld21291)
						Values(
						@Ссылка
						/*,@Версия*/
						,@ПометкаУдаления
						,@Предопределенный
						,@Родитель
						,@ЭтоГруппа
						,@Код
						,@Наименование
						,@ЗагружатьОбъекты
						,@МакетАнкеты
						,@ВидСправочникаДляЗагрузки
						,@Адресная
						,@НаименованиеАнкеты
						,@Вступление
						,@ЗаполнятьАнкетуДанными
						,@ВидАнкеты
						,@СекундОтвета)";
					}
					else
					{
						Команда.CommandText = @"
						Update _Reference178
						Set
						/*_IDRRef	= @Ссылка*/
						/*,_Version	= @Версия*/
						_Marked	= @ПометкаУдаления
						,_IsMetadata	= @Предопределенный
						,_ParentIDRRef	= @Родитель
						,_Folder	= @ЭтоГруппа
						,_Code	= @Код
						,_Description	= @Наименование
						,_Fld2066	= @ЗагружатьОбъекты
						,_Fld2067	= @МакетАнкеты
						,_Fld2068RRef	= @ВидСправочникаДляЗагрузки
						,_Fld2069	= @Адресная
						,_Fld2070	= @НаименованиеАнкеты
						,_Fld2071	= @Вступление
						,_Fld21289	= @ЗаполнятьАнкетуДанными
						,_Fld21290RRef	= @ВидАнкеты
						,_Fld21291	= @СекундОтвета
						Where _IDRRef = @Ссылка";
					}
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					/*Команда.Parameters.AddWithValue("Версия", Версия);*/
					Команда.Parameters.AddWithValue("ПометкаУдаления", ПометкаУдаления);
					Команда.Parameters.AddWithValue("Предопределенный", Предопределенный);
					Команда.Parameters.AddWithValue("Родитель", Родитель);
					Команда.Parameters.AddWithValue("ЭтоГруппа", ЭтоГруппа?new byte[]{0}:new byte[]{1});
					Команда.Parameters.AddWithValue("Код", Код);
					Команда.Parameters.AddWithValue("Наименование", Наименование);
					Команда.Parameters.AddWithValue("ЗагружатьОбъекты", ЗагружатьОбъекты);
					Команда.Parameters.AddWithValue("МакетАнкеты",new byte[0]);
					Команда.Parameters.AddWithValue("ВидСправочникаДляЗагрузки", ВидСправочникаДляЗагрузки.Ключ());
					Команда.Parameters.AddWithValue("Адресная", Адресная);
					Команда.Parameters.AddWithValue("НаименованиеАнкеты", НаименованиеАнкеты);
					Команда.Parameters.AddWithValue("Вступление", Вступление);
					Команда.Parameters.AddWithValue("ЗаполнятьАнкетуДанными", ЗаполнятьАнкетуДанными);
					Команда.Parameters.AddWithValue("ВидАнкеты", ВидАнкеты.Ключ());
					Команда.Parameters.AddWithValue("СекундОтвета", СекундОтвета);
					Команда.ExecuteNonQuery();
				}
			}
		}
		public void Удалить()
		{
			using (var Подключение = new SqlConnection(СтрокаСоединения))
			{
				Подключение.Open();
				using (var Команда = Подключение.CreateCommand())
				{
					Команда.CommandText = @"Delete _Reference178
					Where _IDRRef=@Ссылка";
					Команда.Parameters.AddWithValue("Ссылка", Ссылка.ToByteArray());
					Команда.ExecuteNonQuery();
				}
			}
		}
		/*МодульОбъекта*/
		////////////////////////////////////////////////////////////////////////////////
		// ЭКСПОРТНЫЕ ПРОЦЕДУРЫ И ФУНКЦИИ

		public object СформироватьМакет(/*ДокументМакет*/)
		{
			//Запрос = Новый Запрос;
			//Запрос.УстановитьПараметр("ТиповаяАнкета",	Ссылка);
			/*Запрос.Текст =
	"ВЫБРАТЬ
	|	ТиповыеАнкетыВопросыАнкеты.Ссылка,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос КАК Вопрос,
	|	ТиповыеАнкетыВопросыАнкеты.Раздел КАК Раздел,
	|	ВариантыОтветовОпросов.Наименование,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос.ПолнаяФормулировка КАК ПолнаяФормулировка,
	|	ВариантыОтветовОпросов.ТребуетРазвернутыйОтвет,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос.Представление,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос.Код КАК КодВопроса,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос.ТипЗначения,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос.ТипОтветаНаВопрос,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос.ВидКонтактнойИнформации,
	|	ВариантыОтветовОпросов.Представление КАК ВариантОтветаПредставление,
	|	ТиповыеАнкетыВопросыАнкеты.НомерСтроки КАК НомерСтрокиВАнкете,
	|	ВариантыОтветовОпросов.Код КАК КодВариантаОтвета,
	|	ВопросыДляАнкетированияКолонкиТаблицы.НомерСтроки КАК НомерКолонки,
	|	ВопросыДляАнкетированияКолонкиТаблицы.КолонкаТаблицы,
	|	ТиповыеАнкетыВопросыАнкеты.Вопрос.КоличествоСтрокТаблицы,
	|	ВопросыДляАнкетированияКолонкиТаблицы.КолонкаТаблицы.Представление
	|ИЗ
	|	Справочник.ТиповыеАнкеты.ВопросыАнкеты КАК ТиповыеАнкетыВопросыАнкеты
	|		ЛЕВОЕ СОЕДИНЕНИЕ Справочник.ВариантыОтветовОпросов КАК ВариантыОтветовОпросов
	|		ПО ТиповыеАнкетыВопросыАнкеты.Вопрос = ВариантыОтветовОпросов.Владелец
	|		ЛЕВОЕ СОЕДИНЕНИЕ ПланВидовХарактеристик.ВопросыДляАнкетирования.КолонкиТаблицы КАК ВопросыДляАнкетированияКолонкиТаблицы
	|		ПО ТиповыеАнкетыВопросыАнкеты.Вопрос = ВопросыДляАнкетированияКолонкиТаблицы.Ссылка
	|ГДЕ
	|	ТиповыеАнкетыВопросыАнкеты.Ссылка = &ТиповаяАнкета
	|
	|УПОРЯДОЧИТЬ ПО
	|	НомерСтрокиВАнкете
	|ИТОГИ
	|	МАКСИМУМ(НомерСтрокиВАнкете)
	|ПО
	|	Раздел,
	|	Вопрос";*/
			//МакетАнкетыДляПечати = ПолучитьМакет("ТиповаяАнкета");
			//ДокументМакет.Очистить();
			//МакетАнкетыДляПечати.Области.ИмяАнкеты.Текст	= ?(НаименованиеАнкеты = "", Наименование, НаименованиеАнкеты);
			//МакетАнкетыДляПечати.Области.Вступление.Текст	= Вступление;
			//ДокументМакет.ВставитьОбласть(МакетАнкетыДляПечати.Области.Заголовок, 		ДокументМакет.Область("R1C1"), , Ложь);
			//НомерСтрокиВМакете = 4;
			//Результат = Запрос.Выполнить();
			//ВыборкаЗапросаПоРазделам = Результат.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, "Раздел");
			while(true/*ВыборкаЗапросаПоРазделам.Следующий()*/)
			{
				//ОбластьРаздел = МакетАнкетыДляПечати.Область("R8");
				/*//МакетАнкетыДляПечати.Области.ВариантОтвета;
*/
				//ДокументМакет.ВставитьОбласть(ОбластьРаздел, ДокументМакет.Область("R"+НомерСтрокиВМакете+"C1"), , Истина);
				if(true/*ВыборкаЗапросаПоРазделам.Раздел = Справочники.РазделыАнкеты.ПустаяСсылка()*/)
				{
					//НаименованиеРаздела = "";
				}
				//ДокументМакет.Область("R"+НомерСтрокиВМакете+"C1").Текст 	= НаименованиеРаздела;
				//НомерСтрокиВМакете = НомерСтрокиВМакете + 1;
				//ВыборкаЗапросаПоВопросам = ВыборкаЗапросаПоРазделам.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией, "Вопрос");
				while(true/*ВыборкаЗапросаПоВопросам.Следующий()*/)
				{
					//ОбластьВопрос 			= МакетАнкетыДляПечати.Область("R5");
					//ОбластьТиповойОтвет 	= МакетАнкетыДляПечати.Область("R6");
					//ОбластьВариантОтвета 	= МакетАнкетыДляПечати.Область("R7");
					//ДокументМакет.ВставитьОбласть(ОбластьВопрос, ДокументМакет.Область("R"+НомерСтрокиВМакете+"C1"), , Истина);
					//ДокументМакет.Область("R"+НомерСтрокиВМакете+"C1").Текст 	= "№" + ВыборкаЗапросаПоВопросам.НомерСтрокиВАнкете + ". " + ?(ВыборкаЗапросаПоВопросам.ПолнаяФормулировка = "", ВыборкаЗапросаПоВопросам.ВопросПредставление, ВыборкаЗапросаПоВопросам.ПолнаяФормулировка);
					if(true/*ВыборкаЗапросаПоВопросам.ВопросТипОтветаНаВопрос = Перечисления.ТипыОтветаНаВопросАнкеты.Дата или
				ВыборкаЗапросаПоВопросам.ВопросТипОтветаНаВопрос = Перечисления.ТипыОтветаНаВопросАнкеты.Число или
				ВыборкаЗапросаПоВопросам.ВопросТипОтветаНаВопрос = Перечисления.ТипыОтветаНаВопросАнкеты.Строка или
				ВыборкаЗапросаПоВопросам.ВопросТипОтветаНаВопрос = Перечисления.ТипыОтветаНаВопросАнкеты.Булево*/)
					{
						//НомерСтрокиВМакете = НомерСтрокиВМакете + 1;
						//ДокументМакет.ВставитьОбласть(ОбластьТиповойОтвет, ДокументМакет.Область("R"+НомерСтрокиВМакете+"C1"), , Ложь);
						//ДокументМакет.Область("R"+НомерСтрокиВМакете+"C2").Заполнение = ТипЗаполненияОбластиТабличногоДокумента.Параметр;
						//ДокументМакет.Область("R"+НомерСтрокиВМакете+"C2").Параметр	= "ТиповойОтвет" + ВыборкаЗапросаПоВопросам.КодВопроса;
					}
					//НомерСтрокиВМакете = НомерСтрокиВМакете + 1;
				}
				//;;
			}
			/*// по разделам
*/
			//ДокументМакет.Область("C2").ШиринаКолонки = 3;
			//ПараметрыМакета = ДокументМакет.Параметры;
			return null;
		}
		// СформироватьМакет()
		// Восстанавливает сохраненный ранее макет анкеты
		//
		// Параметры:
		//	Нет.
		//
		// Возвращаемое значение:
		//	Табличный документ, содержащий последний сохраненный вариант анкеты .
		//

		public object ВосстановитьМакет(/**/)
		{
			//ТабличныйДокумент = МакетАнкеты.Получить();
			if(true/*ТипЗнч(ТабличныйДокумент) = Тип("ТабличныйДокумент")*/)
			{
			}
			return null;
		}
		// ВосстановитьМакет()
		// Сохраняет макет анкеты
		//

		public void СохранитьМакет(/*ТабличныйДокумент*/)
		{
			//НовыйТабДок = Новый ТабличныйДокумент();
			//НовыйТабДок.ВставитьОбласть(ТабличныйДокумент.Область(), НовыйТабДок.Область(), , Ложь);
			//МакетАнкеты = Новый ХранилищеЗначения(НовыйТабДок, Новый СжатиеДанных());
		}
		// СохранитьМакет()
		// Процедура выводит на экран печатную форму анкеты
		//
		// Параметры:
		//	Нет
		//
		// Возвращаемое значение:
		//	Нет.
		//

		public void Печать(/**/)
		{
			//ПечатныйДокумент = Новый ТабличныйДокумент;
			//ПечатныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_ТиповыеАнкеты";
			//ПечатныйДокумент.Вывести(ВосстановитьМакет());
			/*// если макет еще был заполнен - сформируем его по умолчанию
*/
			if(true/*ПечатныйДокумент.ВысотаТаблицы = 0*/)
			{
				//ПечДок = Новый ТабличныйДокумент;
				//СформироватьМакет(ПечДок);
				//ПечатныйДокумент.Вывести(ПечДок);
			}
			//ПечатныйДокумент.Автомасштаб = Истина;
			//УниверсальныеМеханизмы.НапечататьДокумент(ПечатныйДокумент,,,);
		}
		// Печать()
		////////////////////////////////////////////////////////////////////////////////
		// ОПЕРАТОРЫ ОСНОВНОЙ ПРОГРАММЫ
	}
}